home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Apple II Magazines (DO)
/
Nibble Volume 12, No. 05 (1991-05)(MindCraft Publishing)(Side B).zip
/
Nibble Volume 12, No. 05 (1991-05)(MindCraft Publishing)(Side B).do
/
AMPERSOUND.GS.S
< prev
next >
Wrap
Text File
|
1996-12-24
|
10KB
|
318 lines
******************************************
* *
* AmperSound - IIGS Sound from BASIC *
* by Eric Shepherd *
* (C) 1991 by MindCraft Publishing Corp. *
* Lincoln, MA 01773 *
* *
* Command summary: *
* &ON <osc>,<freq>,<vol> *
* [turn on an oscillator] *
* &EXP <osc>,<freq>,<att>, *
* <sust>,<decay> *
* &STOP <osc> *
* [turn off an oscillator] *
* &L <osc>,<vol> *
* [set loudness of *
* oscillator] *
* &LOAD <startadrs> *
* [Copy a waveform into *
* dedicated Sound RAM] *
* &WAIT <length> *
* [Wait for given time] *
* *
*********** Merlin Pro Assembler *********
* NOTE: The ORG is set this low to accomadate
* SuperGraphics GS.
ORG $8C70
EXP OFF
XC
XC
********************************
* Zero page equates
********************************
LINNUM EQU $50 ;Result of convert
CHRGET EQU $B1 ;Get byte of cmd
CHRGOT EQU $B7
OLDAMP EQU $FA ;Old ampersand command
ATTACK EQU $FC
SUSTAIN EQU $FD
DECAY EQU $FE
********************************
* Ampersand vector
********************************
AMPER EQU $3F5 ;Ampersand vector
********************************
* Sound equates
********************************
SCREG EQU $C03C ;DOC Sound Ctrl Reg
SNDDAT EQU $C03D ;Sound RAM 'window'
ADRSREG1 EQU $C03E ;Sound Adrs Reg low
ADRSREG2 EQU $C03F ;Sound Adrs Reg high
********************************
* ROM Equates
********************************
FRMNUM EQU $DD67 ;Eval real exprn
CHKCOM EQU $DEBE ;Check for a comma
BADQUANT EQU $E199 ;Illegal Quantity Err
EVAL255 EQU $E6F5 ;Eval int exprn <256
COMBYT EQU $E74C ;Skip comma, eval exprn
GETADR EQU $E752 ;Convert real to int
DELAY EQU $FCA8 ;Delay
********************************
* Install AmperSound GS
********************************
LDA AMPER+1 ;Get old
STA OLDAMP ; ampersand vector
LDA AMPER+2 ; and save it for
STA OLDAMP+1 ; future use
LDA #$4C ;JMP opcode
STA AMPER ;Save in & vector
LDA #START ;Get LOB of start address
STA AMPER+1 ;Save it
LDA #>START ;Get HOB of start address
STA AMPER+2 ;Save it
RTS ;Back to BASIC, &Sound ready
******************************************
* Find commands
******************************************
START LDX #6
:1 CMP :TOKENS,X
BEQ :FOUND
DEX
BPL :1
JMP (OLDAMP)
:TOKENS DFB 180,182,179,'L'
DFB 181,221
:FOUND TXA
ASL
TAX
JMP (:ADRS,X)
:ADRS DW ON
DW LOAD
DW STOP
DW VOL
DW WAIT
DW EXP
******************************************
* Turn ON an oscillator
* &ON <osc>,<freq>,<vol>
******************************************
ON HEX AFCA00E1 ;LDA $E100CA
; Get sound interrup stat
STA SCREG ;DOC reg write ON
JSR EVAL255 ;Eval exprn, skip comma
STX $3A ;Save oscillator # for later
JSR OSCCHK ;Check for legal value
JSR CHKCOM ;Skip comma
JSR FRMNUM ;Get frequency
JSR GETADR ;Convert to integer
PHA
TYX
LDA #$00 ;Set low byte of frequency
JSR SETREG ;Execute
PLX
LDA #$20 ;Set high byte of frequency
JSR SETREG ;Execute
JSR COMBYT ;Get volume
LDA #$40 ;Set volume
JSR SETREG ;Execute
LDA #$80 ;Set address of waveform
LDX #$00 ;Starts at $0000 in sound RAM
JSR SETREG ;Execute
LDA #$A0 ;Set up the oscillator
JSR SETREG ;Execute
LDA #$C0 ;Set waveform size to 256 bytes
JSR SETREG ;Execute
RTS ;Return to BASIC
******************************************
* &EXP <attack>,<sust>,<decay>,<osc>,<freq>
******************************************
EXP HEX AFCA00E1
STA SCREG
JSR EVAL255 ;Get oscillator
STX $3A
JSR OSCCHK
JSR CHKCOM
JSR FRMNUM
JSR GETADR
PHA
TYX
LDA #$00
JSR SETREG
PLX
LDA #$20
JSR SETREG
LDX #$00
LDA #$40
JSR SETREG
LDA #$80
JSR SETREG
LDA #$A0
JSR SETREG
LDA #$C0
JSR SETREG
JSR COMBYT ;Get attack
STX ATTACK
JSR COMBYT ;Get sustain
STX SUSTAIN
JSR COMBYT ;Get decay
STX DECAY
* The oscillator is started, volume=0
LDX #$00
EXPLP2 LDA #$40
JSR SETREG
LDA ATTACK
BEQ EXPLP1
JSR DELAY
INX
BNE EXPLP2
EXPLP1 LDX SUSTAIN ;Get ready for sustain
BEQ EXPLP3
JSR LOOP ;Do sustain loop
EXPLP3 LDX #$FF
EXPLP4 LDA DECAY
BEQ EXPLP5
JSR DELAY
LDA #$40
DEX
JSR SETREG
CPX #25 ;Cut off at 25, which is
; pretty quiet
BNE EXPLP4
EXPLP5 RTS
******************************************
* Set the register, transfer data
******************************************
SETREG ORA $3A ;Add oscillator to reg #
STA ADRSREG1 ;Store register # to access
STX SNDDAT ;Store byte in a sound register
RTS ;Return to caller
******************************************
* Check for legal oscillator #
******************************************
OSCCHK LDA $3A ;Retreive oscillator #
CMP #30 ;Compare to 30
BGE ILLERR ;No good, error
RTS ;It's OK, return
ILLERR JMP BADQUANT ;Illegal quantity error
******************************************
* &LOAD - copy waveforms to sound RAM
* &LOAD <start>
******************************************
LOAD JSR CHRGET ;Advance TXTPTR
JSR FRMNUM ;Get start address
JSR GETADR ;Convert to integer
LDA LINNUM ;Get low byte of address
STA LOAD1+1 ;Save low byte as default
LDA LINNUM+1 ;Get high byte of address
STA LOAD1+2 ;Save high byte as default
HEX AFCA00E1 ;LDA $E100CA
; Get sound interrupt stat
ORA #$40 ;Switch to adrs reg
STA SCREG ;to change waveform
LDY #$00 ;Clear loop register
STY ADRSREG2 ;Clear address reg high
PLOOP STY ADRSREG1 ;Clear address reg low
LOAD1 LDA $0000,Y ;Get data from address
; in waveform table
; plus Y
STA SNDDAT ;and save it in the Sound RAM
INY ;Ready for another byte
BNE PLOOP ;If not done, copy another byte
RTS ;Copy complete!
*****************************************
* &STOP <osc> -turn off an
* oscillator
*****************************************
STOP HEX AFCA00E1 ;Get sout interrupt stat
STA SCREG ;Save status - DOC regs
JSR EVAL255 ;Get oscillator #
STX $3A ;Save it
JSR OSCCHK ;Check for legal osc
LDA #00 ;Change frequency low
LDX #00 ;Value to save
JSR SETREG ;Make the call
LDA #$20 ;Change frequency high
JSR SETREG ;Make the call
LDA #$40 ;Volume
JSR SETREG ;Make the call
LDA #$80 ;Waveform address
LDX #$00 ;Set to zero
JSR SETREG ;Make the call
LDA #$A0 ;Clear control reg
JSR SETREG ;Make the call
LDA #$C0 ;Waveform size
JSR SETREG ;Make the call
JSR CHRGOT ;Do another oscillator?
BNE STOP ;Yes, do another
RTS ;Back to BASIC
******************************************
* &L <osc>,<vol> - change volume
* of a specified oscillator
******************************************
VOL HEX AFCA00E1 ;Get sound interrupt stat
STA SCREG ;Write DOC regs
JSR EVAL255 ;Get oscillator #
STX $3A ;Save it
JSR OSCCHK ;Check for legal osc
JSR COMBYT ;Get volume
LDA #$40 ;Volume register #0
JSR SETREG ;Set volume
RTS ;Back to BASIC
******************************************
* &WAIT <length> - wait for specified
* time
******************************************
WAIT JSR EVAL255 ;Get length (0-255)
LOOP LDA #$FD ;Put 255 in A
JSR DELAY ;Delay
DEX ;Decrement loop
BNE LOOP ;Loop back if needed
RTS ;Back to BASIC
LST OFF